<?php

namespace Back\Controller;


use Think\Controller;

class CodeController extends Controller
{

    public function setAction()
    {
        if (IS_POST) {
            // 一: 获取数据
            // 获取表, 表配置
            $table = I('post.table');
            $comment = I('post.comment');
            // 获取 模型名控制器名
            // 上面的逻辑, 简写代码如下
            $model_name = $controller_name = implode(array_map('ucfirst', explode('_', $table)));

            // 表的字段结构
            $model = M($model_name);
            // 获取字段
//            $fields = $model->getDbFields();
            // 获取主键
            $pk_field = $model->getPk();
            // 获取字段及其配置
            $fields = I('post.fields');
//            dump($fields);

            // 二: 替换生成控制器代码
            // 代码模板内容,
            $template_file = APP_PATH . 'Back/CodeTemplate/Controller.template';
            $template = file_get_contents($template_file);
            // 替换生成
            $search = ['%CONTROLLER%', '%MODEL%', '%PK_FIELD%'];
            $replace = [$controller_name, $model_name, $pk_field];
            $content = str_replace($search, $replace, $template);
            // 写入控制器类文件即可
            $controller_file = APP_PATH . 'Back/Controller/' . $controller_name . 'Controller.class.php';
            file_put_contents($controller_file, $content);
            echo '控制器:', $controller_file, '生成完毕<br>';

            // 三 替换生成, 模型代码
            $template_file = APP_PATH . 'Back/CodeTemplate/Model.template';
            $template = file_get_contents($template_file);
            // 替换生成
            $search = ['%MODEL%'];
            $replace = [$model_name];
            $content = str_replace($search, $replace, $template);
            // 写入控制器类文件即可
            $model_file = APP_PATH . 'Back/Model/' . $model_name . 'Model.class.php';
            file_put_contents($model_file, $content);
            echo '模型:', $model_file, '生成完毕<br>';

            // 确保模板目录存在
            $template_path = APP_PATH . 'Back/View/' . $controller_name;
            if(! is_dir($template_path)) {
                mkdir($template_path);
            }


            // 四: 生成list模板
            // 1, 处理与字段相关任务
            $field_head_list = $field_value_list = '';
            foreach($fields as $field => $options) {
                // A.处理列表字段头
                if (isset($options['list'])) {
                    // 需要展示到列表中
                    if (isset($options['sort'])) {
                        // 需要排序
                        $template_file = APP_PATH . 'Back/CodeTemplate/fieldHeadSort.template';
                    } else {
                        // 不需要排序
                        $template_file = APP_PATH . 'Back/CodeTemplate/fieldHead.template';
                    }

                    $template = file_get_contents($template_file);
                    // 替换生成
                    $search = ['%FIELD%', '%FIELD_COMMENT%'];
                    $replace = [$options['name'], $options['comment']];
                    $content = str_replace($search, $replace, $template);
                    $field_head_list .= $content;
                }

                // B.字段值列表
                if (isset($options['list'])) {
                    $template_file = APP_PATH . 'Back/CodeTemplate/fieldValue.template';
                    $template = file_get_contents($template_file);
                    // 替换生成
                    $search = ['%FIELD%'];
                    $replace = [$options['name']];
                    $content = str_replace($search, $replace, $template);
                    $field_value_list .= $content;
                }
            }

            // 2. 替换list整体模板
            $template_file = APP_PATH . 'Back/CodeTemplate/list.template';
            $template = file_get_contents($template_file);
            // 替换生成
            $search = ['%COMMENT%', '%PK_FIELD%', '%FIELD_HEAD_LIST%', '%FIELD_VALUE_LIST%'];
            $replace = [$comment, $pk_field, $field_head_list, $field_value_list];
            $content = str_replace($search, $replace, $template);
            // 写入控制器类文件即可
            $list_file = $template_path . '/' . 'list.html';
            file_put_contents($list_file, $content);
            echo '列表模板:', $list_file, '生成完毕<br>';


            // 五,生产set模板
            // 1, 替换生成子模板
            $field_set_list = '';
            foreach($fields as $field => $options) {
                if(isset($options['set'])) {
                    // 需要被设置
                    $template_file = APP_PATH . 'Back/CodeTemplate/fieldSet.template';
                    $template = file_get_contents($template_file);
                    // 替换生成
                    $search = ['%FIELD%', '%FIELD_COMMENT%'];
                    $replace = [$options['name'], $options['comment']];
                    $content = str_replace($search, $replace, $template);
                    $field_set_list .= $content;
                }
            }

            // 2. 整体模板
            $template_file = APP_PATH . 'Back/CodeTemplate/set.template';
            $template = file_get_contents($template_file);
            // 替换生成
            $search = ['%COMMENT%', '%PK_FIELD%', '%FIELD_SET_LIST%'];
            $replace = [$comment, $pk_field, $field_set_list];
            $content = str_replace($search, $replace, $template);
            // 写入控制器类文件即可
            $set_file = $template_path . '/' . 'set.html';
            file_put_contents($set_file, $content);
            echo '列表模板:', $set_file, '生成完毕<br>';

        } else {
            // 展示配置表单
            $this->display();
        }
    }

    /**
     * ajax获取字段处理
     */
    public function ajaxAction()
    {
        $table = I('request.table');
        // 处理模型
        $model_name = implode(array_map('ucfirst', explode('_', $table)));
        $model = M($model_name);
        // 获取字段
        $fields = $model->getDbFields();
        // 获取主键
        $pk_field = $model->getPk();

        $this->ajaxReturn(['fields'=>$fields, 'pk_field'=>$pk_field]);
    }

}